{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "#竞赛的评价指标为logloss\n",
    "from sklearn.metrics import log_loss  \n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline\n",
    "data = pd.read_csv(\"diabetes.csv\")\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  120.894531      69.105469      20.536458   79.799479   \n",
       "std       3.369578   31.972618      19.355807      15.952218  115.244002   \n",
       "min       0.000000    0.000000       0.000000       0.000000    0.000000   \n",
       "25%       1.000000   99.000000      62.000000       0.000000    0.000000   \n",
       "50%       3.000000  117.000000      72.000000      23.000000   30.500000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    31.992578                  0.471876   33.240885    0.348958  \n",
       "std      7.884160                  0.331329   11.760232    0.476951  \n",
       "min      0.000000                  0.078000   21.000000    0.000000  \n",
       "25%     27.300000                  0.243750   24.000000    0.000000  \n",
       "50%     32.000000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 各属性的统计特性\n",
    "data.describe()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(768, 9)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Pregnancies                 0\n",
       "Glucose                     0\n",
       "BloodPressure               0\n",
       "SkinThickness               0\n",
       "Insulin                     0\n",
       "BMI                         0\n",
       "DiabetesPedigreeFunction    0\n",
       "Age                         0\n",
       "Outcome                     0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "### 查看是否有空值\n",
    "data.isnull().sum()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  \n",
       "0                     0.627   50  \n",
       "1                     0.351   31  \n",
       "2                     0.672   32  \n",
       "3                     0.167   21  \n",
       "4                     2.288   33  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#准备数据\n",
    "y = data['Outcome'].values\n",
    "X = data.drop('Outcome', axis = 1)\n",
    "X.head()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(768, 8)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#对数据进行归一化操作\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "mn_x = MinMaxScaler()\n",
    "X_train= mn_x.fit_transform(X)\n",
    "\n",
    "\n",
    "A= pd.DataFrame(data=X_train)\n",
    "A.shape\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.352941</td>\n",
       "      <td>0.743719</td>\n",
       "      <td>0.590164</td>\n",
       "      <td>0.353535</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.500745</td>\n",
       "      <td>0.234415</td>\n",
       "      <td>0.483333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.058824</td>\n",
       "      <td>0.427136</td>\n",
       "      <td>0.540984</td>\n",
       "      <td>0.292929</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.396423</td>\n",
       "      <td>0.116567</td>\n",
       "      <td>0.166667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.470588</td>\n",
       "      <td>0.919598</td>\n",
       "      <td>0.524590</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.347243</td>\n",
       "      <td>0.253629</td>\n",
       "      <td>0.183333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.058824</td>\n",
       "      <td>0.447236</td>\n",
       "      <td>0.540984</td>\n",
       "      <td>0.232323</td>\n",
       "      <td>0.111111</td>\n",
       "      <td>0.418778</td>\n",
       "      <td>0.038002</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.688442</td>\n",
       "      <td>0.327869</td>\n",
       "      <td>0.353535</td>\n",
       "      <td>0.198582</td>\n",
       "      <td>0.642325</td>\n",
       "      <td>0.943638</td>\n",
       "      <td>0.200000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          0         1         2         3         4         5         6  \\\n",
       "0  0.352941  0.743719  0.590164  0.353535  0.000000  0.500745  0.234415   \n",
       "1  0.058824  0.427136  0.540984  0.292929  0.000000  0.396423  0.116567   \n",
       "2  0.470588  0.919598  0.524590  0.000000  0.000000  0.347243  0.253629   \n",
       "3  0.058824  0.447236  0.540984  0.232323  0.111111  0.418778  0.038002   \n",
       "4  0.000000  0.688442  0.327869  0.353535  0.198582  0.642325  0.943638   \n",
       "\n",
       "          7  \n",
       "0  0.483333  \n",
       "1  0.166667  \n",
       "2  0.183333  \n",
       "3  0.000000  \n",
       "4  0.200000  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "lr= LogisticRegression()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params={}, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score=True,\n",
       "       scoring=None, verbose=0)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 交叉验证用于评估模型性能和进行参数调优（模型选择）,cv=5,有20%作为测试数据\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "lr_penalty= LogisticRegression()\n",
    "grid= GridSearchCV(lr_penalty, tuned_parameters,cv=5)\n",
    "grid.fit(X_train,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.772135416667\n",
      "{'penalty': 'l1', 'C': 10}\n"
     ]
    }
   ],
   "source": [
    "#参数调优\n",
    "print(grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))\n",
    "    pyplot.errorbar(x_axis, test_scores[:,i], yerr=test_stds[:,i] ,label = penaltys[i] +' Test')\n",
    "    pyplot.errorbar(x_axis, train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'neg-logloss' )\n",
    "pyplot.savefig('LogisticGridSearchCV_C.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.774739583333\n",
      "{'C': 10}\n"
     ]
    }
   ],
   "source": [
    "#线性SVM正则参数调优\n",
    "from sklearn.svm import LinearSVC\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "param_grid = {'C': Cs}\n",
    "grid = GridSearchCV(LinearSVC(), param_grid, cv=5)\n",
    "grid.fit(X_train, y)\n",
    "print(grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,\n",
       "  decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',\n",
       "  max_iter=-1, probability=False, random_state=None, shrinking=True,\n",
       "  tol=0.001, verbose=False),\n",
       "       fit_params={}, iid=True, n_jobs=1,\n",
       "       param_grid={'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000], 'gamma': [0.0001, 0.001, 0.01, 0.1, 1]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score=True,\n",
       "       scoring=None, verbose=0)"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#RBF核SVM正则参数调优\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "gammas = [0.0001,0.001, 0.01, 0.1, 1]\n",
    "#gammas =[1e-5, 1e-6]\n",
    "param_grid = {'C': Cs, 'gamma' : gammas}\n",
    "grid = GridSearchCV(SVC(kernel='rbf'), param_grid, cv=5)\n",
    "\n",
    "grid.fit(X_train, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.779947916667\n",
      "{'C': 1, 'gamma': 1}\n"
     ]
    }
   ],
   "source": [
    "print(grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
